char *thread_name;
+ gboolean complete;
gboolean destroyed;
GThread *worker;
ot_worker_queue_start (OtWorkerQueue *queue)
{
queue->worker = g_thread_new (queue->thread_name, ot_worker_queue_thread_main, queue);
+ ot_worker_queue_push (queue, queue); /* Self marks end of (initial) queue */
}
void
while (!g_queue_peek_tail_link (&queue->queue))
{
- if (queue->idle_callback && g_atomic_int_get (&queue->holds) == 0)
+ if (queue->idle_callback && queue->complete &&
+ g_atomic_int_get (&queue->holds) == 0)
g_main_context_invoke (queue->idle_context,
invoke_idle_callback,
queue);
if (!item)
break;
- queue->work_func (item, queue->work_data);
+ if (item == queue)
+ queue->complete = TRUE;
+ else
+ queue->work_func (item, queue->work_data);
}
return NULL;